package com.kaifamiao.month03.day0316;

import java.util.Arrays;

/**
 * 能够存储多个元素
 * 能够自动进行扩容(阈值为 0.75 ，每次扩容 1.5 倍 )
 * 能够删除元素，删除成功后将删除的元素返回
 * 能够添加元素（默认添加到末尾）
 * 获取某个元素的位置（索引/下标）
 * 能够通过下标获取该位置的元素
 * 能够获取元素的个数
 * 以字符串的形式显示内容
 */
public class ArrayList {

    String[] stringArray = new String[10];
    int count = 0;
    final double threshold = 0.75;
    final double growth = 1.5;

    /**
     * 扩容，阈值为 0.75 ，每次扩容 1.5 倍
     */
    public void grow(){
        if(count >= stringArray.length * threshold ){
            stringArray = Arrays.copyOf(stringArray, (int) Math.round(stringArray.length * growth));
        }
    }
    /**
     * 删除指定位置的元素
     * @param index 需要删除元素的下标
     * @return 删除的元素内容
     */
    public String remove(int index){
        checkIndex(index);
        String s = indexOf(index);
        System.arraycopy(stringArray,index + 1,stringArray,index,count - index - 1);
        stringArray[count] = null;
        count --;
        return s;
    }

    /**
     * 检查下标是否正常
     * @param index 下标
     */
    public void checkIndex(int index){
        if(index < 0 || index >= count){
            throw new RuntimeException("下标异常：" + index);
        }
    }
    /**
     * 查找指定位置元素
     * @param index 需要查找的元素的位置
     * @return 该位置的元素
     */
    public String indexOf(int index){
        checkIndex(index);
        return stringArray[index];
    }

    /**
     * 给指定位置添加元素
     * @param index 需要添加元素的位置
     * @param element 需要添加的元素内容
     */
    public void add(int index,String element){
        checkIndex(index);
        grow();
        System.arraycopy(stringArray,index,stringArray,index + 1,stringArray.length - index - 1);
        stringArray[index] = element;
        count ++;
    }

    /**
     * 默认给末尾添加元素
     * @param element 需要添加的元素
     */
    public void add(String element){
        grow();
        stringArray[count] = element;
    }

    /**
     * 获取某个元素的位置
     * @param element 需要查找的元素
     * @return 该元素所在的位置
     */
    public int index(String element){
        for(int i = 0; i < stringArray.length; i ++){
            if(element.equals(stringArray[i])){
                return i;
            }
        }
        return -1; // 未找到返回 -1
    }

    /**
     * 统计元素的数量
     * @return 元素的数量
     */
    public int count(){
        return count;
    }

    /**
     * 转换成字符串
     * @return 转换之后的字符串
     */
    public String convert(){
        return Arrays.toString(Arrays.copyOf(stringArray,count));
    }

}
